package ar.com.jsejtman.cajugastos2.core.entity;

import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;

/**
 * Representa un gasto compuesto.
 * 
 * @author jsejtman
 * 
 */
@Entity
@DiscriminatorValue("GASTO_COMPUESTO")
public class GastoCompuesto extends Gasto {

	/**
	 * Listado de gastos componentes.
	 */
	@OneToMany
	@JoinTable(name = "GASTOS_COMPUESTOS_GASTOS_SIMPES",
	           joinColumns = @JoinColumn(name = "GASTO_COMPUESTO_ID"),
	           inverseJoinColumns = @JoinColumn(name = "GASTO_SIMPLE_ID"))
	private Set<GastoSimple> gastosComponentes;

	/**
	 * Obtiene el monto del gasto sumando los montos de los componentes.
	 * 
	 * @return el monto calculado.
	 */
	@Override
	public final BigDecimal getMonto() {

		float monto = 0f;
		for (GastoSimple gasto : this.gastosComponentes) {
			monto += gasto.getMonto().floatValue();
		}
		return new BigDecimal(monto);
	}

	/**
	 * Getter de gastos componentes.
	 * 
	 * @return the gastosComponentes
	 */
	public final Set<GastoSimple> getGastosComponentes() {

		return new HashSet<GastoSimple>(this.gastosComponentes);
	}

	/**
	 * Asigna un nuevo valor a gastosComponentes.
	 * 
	 * @param gastosComponentes El valor a asignar a gastosComponentes.
	 */
	protected final void setGastosComponentes(final Set<GastoSimple> gastosComponentes) {

		this.gastosComponentes = gastosComponentes;
	}

	/**
	 * Asigna un nuevo valor a gastosComponentes.
	 * 
	 * @param gastoComponente El gasto a agregas.
	 */
	public final void addGastoComponente(final GastoSimple gastoComponente) {

		if (this.gastosComponentes == null) {
			this.gastosComponentes = new HashSet<GastoSimple>();
		}
		this.gastosComponentes.add(gastoComponente);
	}

}
